<?php

namespace App\Http\Controllers\Admin;

use Illuminate\Http\Request;
use App\Http\Controllers\Controller;
use DB;
use App\Admin\Contract;

class TestPlanController extends Controller
{
    //检测申请列表展示--注册客户
    public function index(Request $request)
    {
        if ($request->expectsJson()) {
            $sql = "SELECT
                        A.*,
                        B.batchNum 
                    FROM
                        a_testplan A
                        LEFT JOIN a_contract B ON A.contract_id = B.id 
                    WHERE
                        manager_id = :manager_id";

            $data = DB::select($sql, ['manager_id' => auth('admin')->user()->id]);

            $jsonData['data'] = $data;
            return response()->json($jsonData);
        } else {
            // $data = Manager::get();
            if (!config('constant.is_profession_ver')){
                //标准版用户，无法使用此功能
                $bigTitle = "抱歉, 您无法使用此功能！";
                $littleTitle = "";
                return view('admin.manager.addLimit',compact('bigTitle', 'littleTitle'));
            }
            return view('admin.testPlan.index');
        }
    }

    //检测申请列表展示--管理员
    public function indexAll(Request $request)
    {
        if ($request->expectsJson()) {
            $sql = "SELECT
                        A.*,
                        B.client_name,
                        C.batchNum 
                    FROM
                        a_testplan A
                        LEFT JOIN manager B ON A.manager_id = B.id
                        LEFT JOIN a_contract C ON A.contract_id = C.id";

            $data = DB::select($sql);

            $jsonData['data'] = $data;
            return response()->json($jsonData);
        } else {
            if (!config('constant.is_profession_ver')){
                //标准版用户，无法使用此功能
                $bigTitle = "抱歉, 您无法使用此功能！";
                $littleTitle = "";
                return view('admin.manager.addLimit',compact('bigTitle', 'littleTitle'));
            }
            return view('admin.testPlan.indexAll');
        }
    }

    //检测申请添加
    public function add(Request $request)
    { 
        if ($request->isMethod('POST')) {
            //-----制作申请单号 例：20062001  -----start
            $current_date = Date('ymd');
            //如果还没有申请单，申请单号为 年月日 + “01”
            if (DB::table('a_testplan')->count() === 0) {
                $requisitionNum = $current_date . "01";
            } else {
                $sql = "SELECT num from a_testplan where id=(select max(id) from a_testplan)";
                $res = DB::select($sql);
                $str_res = $res[0]->num;
                $date = substr($str_res, 0, 6);

                if ($date === $current_date) {
                    //如果批次编号的前6位与当前日期相同
                    $num = intval(substr($str_res, 6)) + 1;
                    $str_num = sprintf('%02d', $num);
                    $requisitionNum = $current_date . $str_num;
                } else {
                    $requisitionNum = $current_date . "01";
                }
            }
            //-----制作申请单号 例：20062001  -----end

            //-----制作附件路径  -----start
            $subDir = date('Y-m');
            $file_path = "OnlineAccept/$subDir";
            $dir = iconv("UTF-8", "GBK", "storage/OnlineAccept/$subDir");
            if (!file_exists($dir)){
                mkdir ($dir,0777,true);
            }
            $str_random = str_random(5);
            $client_name = auth('admin')->user()->client_name;
            $file_name = "附件_{$client_name}_{$str_random}.xls";
            $fileFullName = "$file_path/$file_name";
            //-----制作附件路径  -----end

            $result = 0;
            //上传附件
            if ($request->hasFile('file') && $request->file->isValid()) {
                $request->file->storeAs($file_path,  $file_name, 'public');

                $result = DB::table('a_testplan')->insert([
                    'num' => $requisitionNum,
                    'count' => $request->count,
                    'manager_id' => auth('admin')->user()->id,
                    'file_path' => $fileFullName
                ]);
            }
            return $result ? '1' : '0';
        } else {
            //判断封底模板文件是否存在
            $template_file = "./storage/OnlineAccept/检测申请模板.xls"; //考虑到兼容Linux，斜杠用“/”
            $exist_template = file_exists($template_file);
            return view('admin.testPlan.add', compact('exist_template'));
        }
    }

    //检测申请撤销
    public function undo(Request $request)
    {
        $id = $request->id;

        $status = DB::table('a_testplan')->where('id', $id)->value('status');
        if ($status != 0) {
            # code...
            return 0;
        }
        // update 返回受影响的行数
        $result = DB::table('a_testplan')->where('id', $id)->update(['status' => '-5']);
        //由于框架自身不支持响应bool值，所以转化一种形式
        return $result >= 0 ? '1' : '0';
    }

    //检测申请受理
    public function accept(Request $request)
    {
        //请求为 ajax 
        if ($request->expectsJson()) {
            $testPlan_id = $request->id;

            $status = DB::table('a_testplan')->where('id', $testPlan_id)->value('status');
            if ($status != 0) {
                # code...
                return 0;
            }

            //获取客户信息 id
            $manager_id = DB::table('a_testplan')->where('id',$testPlan_id)->value('manager_id');
            //查询出客户信息
            $client_info = DB::table('manager')->find($manager_id);
            //-----制作批次编号 例：180001
            $current_year = Date('y');
            //如果还没有批次，批次编号为 年号 + “0001”
            if (Contract::count() === 0) {
                $batchNum = $current_year . "0001";
            } else {
                $sql = "SELECT batchNum from a_contract where id=(select max(id) from a_contract)";
                $res = DB::select($sql);
                $str_res = $res[0]->batchNum;
                $year = substr($str_res, 0, 2);
                //如果批次编号的前两位与当前年号相同
                if ($year === $current_year) {
                    $num = intval(substr($str_res, 2)) + 1;
                    // $str_num = sprintf('%04.0f', $num);
                    $str_num = sprintf('%04d', $num);
                    $batchNum = $current_year . $str_num;
                } else {
                    $batchNum = $current_year . "0001";
                }
            }
            $contract_id = DB::table('a_contract')->insertGetId([
                'batchNum' => $batchNum,
                'client_name' => $client_info->client_name,//送检单位
                'entrusted_company' => $client_info->client_name,//委托单位
                'client_contact' => $client_info->client_contact,
                'client_tel' => $client_info->client_tel,
                'client_addr' => $client_info->client_addr,
                'creator' => auth('admin')->user()->realname
                // 'remark' => $request->remark == "" ? "/" : $request->remark,
                // 'deadline' => $request->deadline === '' ? null : $request->deadline,
                // 'money' => $request->money,
                // 'sample_chuli' => $request->sample_chuli,
                // 'get_report' => $request->get_report,
                // 'test_kind' => $request->test_kind//检测性质
            ]);

            //新建一条记录，用于记录批次的状态时间
            DB::table('a_status_time')->insert([
                'contract_id' => $contract_id,
                'key' => str_random(6) //用六位随机字符串作为密码
            ]);

            // update 返回受影响的行数
            $result = DB::table('a_testplan')->where('id', $testPlan_id)->update([
                'contract_id' => $contract_id,
                'status' => '10',
                'accept_time' => date("Y-m-d H:i:s")
            ]);
            //由于框架自身不支持响应bool值，所以转化一种形式
            return $result >= 0 ? '1' : '0';
        }
    }

    //获取排号
    public function getSort(Request $request)
    {
        $id = $request->id;
        $created_at = DB::table('a_testplan')->where('id', $id)->value('created_at');
        $result = DB::table('a_testplan')->where('status', '0')->where('created_at', '<', $created_at)->count();
        return $result;
    }

    //管理员修改
    public function edit(Request $request)
    {
        $id = $request->id;
        if ($id == 1) {
            //1为admin 超级管理员，禁止操作
            return '岂有此理，超级管理员你都敢动！！！';
        }
        if ($request->isMethod('POST')) {
            //  sleep (3);//睡3秒
            $data = $request->only(['role_id', 'status', 'istester', 'partner']);
            if ($data['role_id'] == 1) {
                //1为 角色 超级管理员，禁止操作
                return '0';
            }
            //update 返回受影响的行数
            $result = Manager::where('id', $id)->update($data);
            //由于框架自身不支持响应bool值，所以转化一种形式
            return $result >= 0 ? '1' : '0';
        } else {
            //查询要修改的管理员信息
            $data = Manager::find($id);
            if ($data) {
                //查到了结果
                //我们并不总是想要获取数据表的所有列，使用  select 方法，你可以为查询指定自定义的  select 子句
                $data_role = DB::table('role')->select('id', 'role_name')->where('id', '>', '1')->where('id', '!=', '50')->get();
                return view('admin.manager.edit', compact('data', 'data_role'));
            } else {
                //未查到结果
                $error_title = '';
                $error_description = '当前记录已经删除 ~';

                $js = <<<eof
                    <script type="text/javascript">
                        parent.table_reload(0);//0停留在当前页，1回到第一页
                    </script>
eof;
                echo view('errors.error', compact('error_title', 'error_description'));
                return $js;
            }
        }
    }

    //注册客户修改
    public function regClientEdit(Request $request)
    {
        $id = $request->id;
        if ($id == 1) {
            //1为admin 超级管理员，禁止操作
            return '岂有此理，超级管理员你都敢动！！！';
        }
        if ($request->isMethod('POST')) {
            $data = $request->only(['client_name','client_addr','client_contact','client_tel', 'status']);
            //update 返回受影响的行数
            $result = Manager::where('id', $id)->update($data);
            //由于框架自身不支持响应bool值，所以转化一种形式
            return $result >= 0 ? '1' : '0';
        } else {
            //查询要修改的管理员信息
            $data = Manager::find($id);
            if ($data) {
                //查到了结果
                //我们并不总是想要获取数据表的所有列，使用  select 方法，你可以为查询指定自定义的  select 子句
                return view('admin.manager.regClientEdit', compact('data'));
            } else {
                //未查到结果
                $error_title = '';
                $error_description = '当前记录已经删除 ~';

                $js = <<<eof
                    <script type="text/javascript">
                        parent.table_reload(0);//0停留在当前页，1回到第一页
                    </script>
eof;
                echo view('errors.error', compact('error_title', 'error_description'));
                return $js;
            }
        }
    }
    //管理员修改别人的密码
    public function editpass(Request $request)
    {
        $id = $request->id;
        if ($id == 1) {
            //1为admin 超级管理员，禁止操作
            return '岂有此理，超级管理员你都敢动！！！';
        }

        if ($request->isMethod('POST')) {
            //  sleep (3);//睡3秒

            //编写验证规则
            $arr = [
                'password' => 'required'
            ];
            //进行验证 
            $request->validate($arr);
            //进行登录者的身份验证
            $data_login['username'] = auth('admin')->user()->username; //登录者的登录名
            // $data_login['password'] = md5(env("MD5_SALT") . $request->password_other); //登录者的密码
            $data_login['password'] = $request->password_other; //登录者的密码
            $res = auth('admin')->attempt($data_login);
            if (!$res) {
                //验证没通过
                return '2';
            }
            //如果验证通过，继续向下执行...
            $data['password'] = bcrypt($request->password);
            // $data['password'] = md5(env("MD5_SALT") . $request->password);
            //update 返回受影响的行数
            $result = Manager::where('id', $id)->update($data);
            //由于框架自身不支持响应bool值，所以转化一种形式
            return $result >= 0 ? '1' : '0';
        } else {
            //查询要修改的管理员信息
            $data = Manager::find($id);
            if ($data) {
                //查到了结果
                return view('admin.manager.editpass', compact('data'));
            } else {
                //未查到结果
                $error_title = '';
                $error_description = '当前记录已经删除 ~';

                $js = <<<eof
                    <script type="text/javascript">
                        parent.table_reload(0);//0停留在当前页，1回到第一页
                    </script>
eof;
                echo view('errors.error', compact('error_title', 'error_description'));
                return $js;
            }
        }
    }

    //修改自己的个人信息
    public function editself(Request $request)
    {
        $id = auth('admin')->user()->id;
        if ($request->isMethod('POST')) {
            // dd($request->all());
            //  sleep (3);//睡3秒
            $data = $request->only(['username', 'num', 'telephone', 'depa', 'position', 'email', 'work_date', 'edu', 'school', 'birth', 'zhicheng', 'chizheng','client_name','client_addr','client_contact','client_tel']);
            if (auth('admin')->user()->role_id !== 50) {
                $data['work_date'] = $data['work_date'] === ''  ? null : $data['work_date'];
                $data['birth'] = $data['birth'] === ''  ? null : $data['birth'];
            }
            // dd($data);
            //update 返回受影响的行数
            $result = Manager::where('id', $id)->update($data);
            //由于框架自身不支持响应bool值，所以转化一种形式
            return $result >= 0 ? $data['username'] : '0';
        } else {
            return view('admin.manager.editself');
        }
    }
    //修改自己的密码
    public function editpassself(Request $request)
    {
        $id = auth('admin')->user()->id;

        if ($request->isMethod('POST')) {
            //  sleep (3);//睡3秒

            //编写验证规则
            $arr = [
                'password' => 'required'
            ];
            //进行验证 
            $request->validate($arr);
            //进行登录者的身份验证
            $data_login['username'] = auth('admin')->user()->username; //登录者的登录名
            // $data_login['password'] = md5(env("MD5_SALT") . $request->oldpassword); //登录者的密码
            $data_login['password'] =  $request->oldpassword; //登录者的密码
            $res = auth('admin')->attempt($data_login);
            if (!$res) {
                //验证没通过
                return '2';
            }
            //如果验证通过，继续向下执行...
            $data['password'] = bcrypt($request->password);
            // $data['password'] = md5(env("MD5_SALT") . $request->password);
            //update 返回受影响的行数
            $result = Manager::where('id', $id)->update($data);
            //由于框架自身不支持响应bool值，所以转化一种形式
            return $result >= 0 ? '1' : '0';
        } else {
            return view('admin.manager.editpassself');
        }
    }

    // ajax 验证 username 是否唯一
    public function usernameCheck(Request $request)
    {
        //帐号被占用
        $username = $request->username;

        $data = Manager::where('username', $username)->where('id', '<>', auth('admin')->user()->id)->first();
        $bool = !$data;

        if ($bool) {
            return 'true'; //验证通过
        } else {
            return 'false'; //验证不通过
        }
    }

    // ajax 验证 num 工号 是否唯一
    public function numCheck(Request $request)
    {
        //帐号被占用
        $num = $request->num;

        $data = Manager::where('num', $num)->where('id', '<>', auth('admin')->user()->id)->first();
        $bool = !$data;

        if ($bool) {
            return 'true'; //验证通过
        } else {
            return 'false'; //验证不通过
        }
    }
}
